package com.aliang.book_java1.po.线程.CompletableFuture;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CompletableFutureExample {
    public static void main(String[] args) {
        // 创建一个固定大小的线程池
        ExecutorService executor = Executors.newFixedThreadPool(5);

        long time1=System.currentTimeMillis();
        // 假设我们有一系列输入需要处理
        Integer[] inputsArr={1, 2, 3, 4, 5};
        List<Integer> inputs = Arrays.asList(inputsArr);

        // 创建一个列表来存储CompletableFuture对象
        List<CompletableFuture<Integer>> futures = new ArrayList<>();

        // 提交任务到线程池，并获取CompletableFuture对象
        for (int input : inputs) {
            Task task = new Task();
            CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> task.calculateResult(input), executor);
            futures.add(future);
        }

        // 使用CompletableFuture的allOf方法等待所有任务完成
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));

        // 当所有任务完成时，汇总结果
        try {
            allFutures.get(); // 等待所有任务完成
            List<Integer> results = new ArrayList<>();
            for (CompletableFuture<Integer> future : futures) {
                results.add(future.get()); // 获取每个任务的结果
            }

            long time2=System.currentTimeMillis();

            // 打印或处理汇总结果
            //results.forEach(System.out::println);
            System.out.println("---time---"+(time2-time1));
            System.out.println("---results---"+ JSON.toJSONString(results));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            executor.shutdown(); // 关闭线程池
        }
    }
}
